第二部分是我開始沒有太多時間細打的部分,不過我還是想挑戰看看三十天發文!今天 DAY 20 我會分享一些比較進階的概念,關於啟發式演算法在類神經網路上的應用中,啟發式演算法需要注意什麼事情,在此不會講太多,主要還是圍繞幾個基本觀念在分享。
啟發式演算法在做權重搜索的時候,務必要記得用如同塊狀的搜尋,而不要用一點一點去刺探,原因就是我們會假設我們的目標函數仍然存在一點局部凸性,如果你的參數空間連局部凸性都難以維持,如同像走在陡峭尖刺的地形上,那無論用什麼方法通常都沒辦法找到最佳解,我們期望找到的是一組參數在一個區域內表現皆不錯,然而這是粒子群演算法比較難給予的,除非你讓你的粒子非常多個。
什麼是塊狀搜尋呢?就是你在參數空間中搜索是有一個緩慢的方向,大家朝這個方向去搜尋,就像是一個拖把緩慢拖過一個區域一樣,而不是像派斥侯放射狀去搜尋參數,因為如果你塊狀去搜尋參數,可以同時幫你檢驗凸性,如果凸性不存在,那麼你的最佳解會不斷頻繁切換,不斷被取代,直到他落到某個奇異點,難以再被其他參數取代。
怎樣算尖點?怎樣算是一個合理的最佳解?這個問題比較複雜,要看你的問題還有你設定的參數空間而定,我知道講這個很廢話,但事實是這樣,如果你想要針對你的問題去一步步解決,我給你的最簡單方法就是先讓參數空間的維度盡量小,然後讓參數對於結果的影響先控制住不用太大。
舉例來說,類神經網路的最後一層的權重,是控制最後輸出值要去和標籤值匹配的關鍵,如果你讓那層權重採取梯度下降、批優化等方法,那你前面幾層的權重負擔就比較小,這就是一種控制的方法。或是說你的目標函數盡量先簡單一些,不要因為參數做一點簡單調整就會影響很大,例如先用簡單的 MSE ,至少最後一層輸出層可以控制。
我個人認為 RNN 可以,CNN 我不建議在時間序列上這樣用,原因是 CNN 的核心概念是在鄰近區域中權重共享,但是這個鄰近區域的大小很難真實反映時間序列的潛在相關性,如果你有搭建過基礎的時間序列模型應該可以感覺到,舉例來說基本的 ARMA 模型,你很難從局部一小塊觀察出大樣本的一個 lag, lead 之間的關係。
誤差網路和增量學習可以,但是我建議是在資料預處理的部份得採用關注機制(Attention mechanism)我知道在 RNN與 CNN 中已經很經常這樣使用,但是我認為如果你處理時間序列資料,各種 NN 都會有不錯的結果,這是我一點經驗,這個方法我實務中現在仍然在使用,但是比較複雜一點,你可以先從簡單的開始,如果你在建構一個誤差網路或是增量學習模型,千萬別忘記這個方法。
關注機制唯一要注意的就是你的程式碼能否立即支援,你需要多留意如果你要採用的話,因為他的處理方式不太像一般的資料預處理,可能在你或公司中的一個標準流程中要另外提 feature 去開發。
我們即將進入到第三部分,希望第二部分的一些廢話能對你有幫助。